// 1.编写程序，求100以内所有质数的和。
public class Sum {
    public static void main(String[] args) {
        // 初始化累加器，用于存储质数的总和
        int sum = 0;

        // 输出提示信息
        System.out.println("100以内的质数有：");

        // 遍历2到100之间的所有数字，检查每个数字是否为质数
        // 从2开始，因为1不是质数
        for (int i = 2; i <= 100; i++) {
            // 调用isPrime方法判断当前数字i是否为质数
            if (isPrime(i)) {
                // 如果是质数，打印该数字并在后面加一个空格
                System.out.print(i + " ");
                // 将质数累加到总和sum中
                sum += i;
            }
        }
        // 打印最终结果
        // \n\n表示换两行，使输出更加清晰
        System.out.println("\n\n100以内所有质数的和为：" + sum);
    }

    /**
     * 判断一个数是否为质数（素数）
     * 质数定义：大于1的自然数，除了1和它本身以外不再有其他因数
     * @param num 要判断的数字
     * @return 如果是质数返回true，否则返回false
     */
    public static boolean isPrime(int num) {
        // 情况1：小于2的数都不是质数
        // 因为质数定义要求大于1
        if (num < 2) {
            return false;
        }

        // 情况2：2是唯一的偶质数，直接返回true
        if (num == 2) {
            return true;
        }

        // 情况3：排除所有大于2的偶数
        // 因为除了2以外的偶数都能被2整除，所以不是质数
        if (num % 2 == 0) {
            return false;
        }

        // 情况4：检查奇数是否为质数
        // 从3开始，每次增加2（只检查奇数）
        // 只需要检查到sqrt(num)即可，因为如果num有因数，必有一个小于等于sqrt(num)
        for (int i = 3; i * i <= num; i += 2) {
            // 如果num能被i整除，说明num不是质数
            if (num % i == 0) {
                return false;
            }
        }
        // 如果通过所有检查，说明num是质数
        return true;
    }
}